/**
 * @(#)I18nManager.java 7/06/2010
 *
 * Copyright (c) 2007-2012 PsiqueWare S.A. de C.V. All Rights Reserved.
 * This software is the proprietary information PsiqueWare S.A. de C.V.
 * Use is subject to license terms.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *
 * <br/>Usuario : AngelElectrico
 * <br/>Creaci&oacute;n: 7/06/2010 - 11:59:53 AM
 * <br/>
 * <br/>
 * <br/><t5>Cambios :</t5>
 * <br/><b>Fecha | Autor  |  Cambios</b>
 * <ul>
 * <li>7/06/2010 | <a href = "mailto:AngelElectrico@PsiqueWare.com">&Aacute;ngel El&eacute;ctrico</a> | Creaci&oacute;n del Objeto.</li>
 *
 * </ul>
 */

package com.psiqueware.alheli.i18n;

import com.psiqueware.alheli.i18n.depuracion.CoordinadorBundlesDepuracion;
import com.psiqueware.alheli.i18n.osgi.CoordinadorBundlesOsgi;
import com.psiqueware.alheli.i18n.propertyBundles.CoordinadorBundleProperties;
import com.psiqueware.alheli.i18n.propertyBundles.CoordinadorBundlesSimple;
import com.psiqueware.alheli.i18n.propertyBundles.CoordinadorBundlesSimpleSincronizado;
import com.psiqueware.alheli.i18n.propertyBundles.CoordinadorBundlesSincronizado;
import com.psiqueware.alheli.i18n.reemplazoPredefinido.CoordinadorBundlesReemplazoPredefinido;
import com.psiqueware.alheli.i18n.traductor.CoordinadorBundlesTraductor;
import com.psiqueware.alheli.i18n.traductor.bing.TraductorBingTranslate;

import java.io.File;
import java.util.Collection;
import java.util.Locale;
import java.util.ResourceBundle;

/**
 * Administrador de I18n.
 * <br/>Paquete Original: com.psiqueware.alheli.i18n
 * <br/>Nombre  Original: I18nManager
 * <br/>Oprima para ver : <a href="I18nManager.java.html"><i>C&oacute;digo Fuente</i> </a>
 *
 * @author <a href="mailto:AngelElectrico@PsiqueWare.com">AngelElectrico</a>
 * @version Revision: 1.1 7/06/2010 11:59:53 AM
 * @noinspection StaticMethodNamingConvention, StaticMethodOnlyUsedInOneClass, ClassWithoutConstructor, UtilityClass, UtilityClass, UtilityClassWithoutPrivateConstructor, UnusedDeclaration
 */
public final class I18nManager
{

    /**
     * Devuelve un {@link CoordinadorBundles} con la funcionalidad b&aacute;sica.
     *
     * @return el nuevo {@link CoordinadorBundles}.
     */
    public static CoordinadorBundles getCoordinadorBundles()
    {
        return new CoordinadorBundleProperties();
    }

    /**
     * Devuelve un {@link CoordinadorBundles} que no toma encuenta el contexto sino que agrupa todas las llaves en uno solo.
     *
     * @return el nuevo {@link CoordinadorBundles}.
     */
    public static CoordinadorBundles getCoordinadorBundlesSinContexto()
    {
        return new CoordinadorBundlesSimple();
    }

    /**
     * Devuelve un {@link CoordinadorBundles} que tiene contextos a los que se puede acceder mediante varios hilos a la vez.
     * m&eacute;todos especiales para ser utilizados por diferentes threads.
     * *
     *
     * @return el nuevo {@link CoordinadorBundles}.
     */
    public static CoordinadorBundles getCoordinadorBundlesSincronizado()
    {
        return new CoordinadorBundlesSincronizado();
    }

    /**
     * Devuelve un {@link CoordinadorBundles} que no toma encuenta el contexto sino que agrupa todas las llaves en uno solo y adem&aacute;s es amigable con los Hilos.
     *
     * @return el nuevo {@link CoordinadorBundles}.
     */
    public static CoordinadorBundles getCoordinadorBundlesSinContextoSincronizado()
    {
        return new CoordinadorBundlesSimpleSincronizado();
    }

    /**
     * Devuelve un {@link CoordinadorBundles} especializado para el uso en ambientes OSGI.
     *
     * @return el nuevo {@link CoordinadorBundles}.
     */
    public static CoordinadorBundles getCoordinadorBundlesOsgi()
    {
        return new CoordinadorBundlesOsgi();
    }

    /**
     * Devuelve un <code>CoordinadorBundles</code> que manda a un archivo unificado los valores de todos los {@link ResourceBundle}
     * solicitados atraves de este.
     *
     * @param salvaValoresAqui                 Archivo donde se salvar&aacute;n todos los valores de todos los {@link ResourceBundle} solicitados.
     * @param coordinadorBundlesObtenValoresDe {@link CoordinadorBundles} desde donde se obtendr&aacute;n los valores.
     *
     * @return el nuevo {@link CoordinadorBundles}.
     */
    public static CoordinadorBundles getCoordinadorBundlesDepuracion(final File salvaValoresAqui, final CoordinadorBundles coordinadorBundlesObtenValoresDe)
    {
        return new CoordinadorBundlesDepuracion(salvaValoresAqui, coordinadorBundlesObtenValoresDe);
    }


    /**
     * Devuelve un <code>CoordinadorBundles</code> que manda a un archivo unificado los valores de todos los {@link ResourceBundle}
     * solicitados atraves de este.
     *
     * @param salvaValoresAqui                 Archivo donde se salvar&aacute;n todos los valores de todos los {@link ResourceBundle} solicitados.
     * @param coordinadorBundlesObtenValoresDe {@link CoordinadorBundles} desde donde se obtendr&aacute;n los valores.
     * @param cargarValores                    Indica que si existe el archivo se debe intentar cargar los valores de este.
     *
     * @return el nuevo {@link CoordinadorBundles}.
     */
    public static CoordinadorBundles getCoordinadorBundlesDepuracion(final File salvaValoresAqui, final CoordinadorBundles coordinadorBundlesObtenValoresDe, final boolean cargarValores)
    {
        return new CoordinadorBundlesDepuracion(salvaValoresAqui, coordinadorBundlesObtenValoresDe, cargarValores);
    }

    /**
     * Devuelve un {@link CoordinadorBundles} especializado para realizar traducciones de las llaves obtenidas por otros {@link CoordinadorBundles}.
     *
     * @param traductor              a utilizar por el {@link CoordinadorBundles}.
     * @param coordinadorBundles     a traducir.
     * @param directorioTraducciones {@link File} que apunta al directorio donde se almacenar&aacute;n las traducciones.
     *
     * @return el nuevo {@link CoordinadorBundles}.
     */
    public static CoordinadorBundles getCoordinadorBundlesTraductor(final Traductor traductor, final CoordinadorBundles coordinadorBundles, final File directorioTraducciones)
    {
        return new CoordinadorBundlesTraductor(traductor, coordinadorBundles, directorioTraducciones);
    }

    /**
     * Devuelve un {@link CoordinadorBundles} que acepta un {@link ResourceBundle} y un {@link CoordinadorBundles} hijo.
     * <p/>
     * Del {@link ResourceBundle} se obtendr&aacute;n todos los valores que se pidan en todos los contextos y solo se recurrir&aacute;
     * al {@link CoordinadorBundles} hijo en caso de que se pida alg&uacute;n valor no definido en el {@link ResourceBundle}.
     * <p/>
     * Se acepta un par&aacute;metro con una {@link Collection} de {@link Locale} que indicar&aacute;n los lenguajes para los que
     * se tienen valores en el {@link ResourceBundle}. Si esta lista es <code>null</code> se utilizar&aacute;n los valores por defecto
     * del {@link ResourceBundle} par&aacute;metro para todos los {@link Locale} que se busquen.
     *
     * @param coordinadorBundlesFaltantes para obtener los valores en caso de que no se encuentren en el {@link java.util.ResourceBundle} reemplazos.
     * @param reemplazos                  conjunto de valores para obtener por defecto.
     * @param locales                     para los cuales se tienen definiciones de reemplazo; puede ser <code>null</code> lo que significa que las definiciones funcionan para todos los {@link java.util.Locale}.
     *
     * @return el nuevo {@link CoordinadorBundlesReemplazoPredefinido}.
     */
    public static CoordinadorBundles getCoordinadorBundlesReemplazoPredefinido(final CoordinadorBundles coordinadorBundlesFaltantes, final ResourceBundle reemplazos, final Collection<Locale> locales)
    {
        return new CoordinadorBundlesReemplazoPredefinido(coordinadorBundlesFaltantes, reemplazos, locales);
    }

    /**
     * Devuelve el {@link Traductor} basado en Bing Translate.
     *
     * @return un nuevo {@link Traductor} basado en Bing Translate.
     */
    public static Traductor getTraductor()
    {
        return new TraductorBingTranslate();
    }

    /**
     * Devuelve el {@link Traductor} basado en Bing Translate.
     *
     * @param escucha para el {@link Traductor}.
     *
     * @return un nuevo {@link Traductor} basado en Bing Translate.
     */
    public static Traductor getTraductor(final EscuchaTraductor escucha)
    {
        return new TraductorBingTranslate(escucha);
    }

}

